﻿#pragma once
#include "ByteConvert.h"
#include "ByteOrder.h"
#include "array/Array.hpp"
#include "yzrutil.h"

namespace yzrilyzr_io{
	EBCLASS(DataOutput){
	protected:
	yzrilyzr_array::ByteArray writeBuffer;
	bool bigEndian=true;
	public:
	DataOutput() :writeBuffer(8){}
	void outputOrder(ByteOrder order){
		bigEndian=order == ByteOrder::BIG_ENDIAN;
	}
	virtual void write(const yzrilyzr_array::ByteArray & arr)=0;
	virtual void write(const yzrilyzr_array::ByteArray & arr, u_index off, u_index len)=0;
	virtual void writeBoolean(bool v);
	virtual void writeByte(int8_t v);
	virtual void writeUnsignedByte(uint8_t v);
	virtual void writeShort(int16_t v);
	virtual void writeUnsignedShort(uint16_t v);
	virtual void writeInt(int32_t v);
	virtual void writeUnsignedInt(uint32_t v);
	virtual void writeLong(int64_t v);
	virtual void writeUnsignedLong(uint64_t v);
	virtual void writeFloat(float v);
	virtual void writeDouble(double v);
	virtual void writeUTF(const yzrilyzr_lang::String & v);
	};
}